/***************************************************************************************************
 *Copyright(C),2010-2017,Sumscope
 *FileName	:  string_aes.h
 *Author	:  scofined.qi
 *Version	:  1.0
 *Date		:  2017/04/19
 *Desc		:  //用于主要说明此程序文件完成的主要功能
 *Relation :
 *Others	:  //其他内容说明
 *Function :  //主要函数列表，每条记录应包含函数名及功能简要说明
 *History	:
 * //修改历史记录列表，每条修改记录应包含修改日期、修改者及修改内容简介
 ***************************************************************************************************/
#pragma once

#include "../core.h"

namespace qb {
namespace base {

// 用作类成员或者栈上多次反复使用
class S_CORE_EXPORT StringAes {
  char bKey[64];
  char subKeys[16][48];
  char keyBlock[16];

 public:
  StringAes(const char* tag);
  void SetTag(const char* tag);
  int Encrypt(const char* pszInText, int insize, char* dataencrypted,
              int outsize);
  int Decrypt(const char* pszInText, int insize, char* datadecrypted,
              int outsize);

  /*
  原地加密算法,capcity必须是8的倍数,返回长度一定是8的倍数
  加密后的数据比原始数据要长,且长度肯定是8的倍数
  如果 capcity ==
  ROUND_ALIGN(size,8),那么返回值是capcity,buffer就不是以0结尾的字符串了
  */
  int EncryptInPlace(char* buffer, int size, int capcity);

  /*
  原地解码算法,size<=capcity且都必须是8的倍数
  */
  int DecryptInPlace(char* buffer, int size, int capcity);
};

class AesCoderImpl;
class S_CORE_EXPORT BlockAes {
  AesCoderImpl* m_impl;

 public:
  BlockAes(const char* tag);
  ~BlockAes();
  void SetTag(const char* tag);
  int Encrypt(const char* pszInText, int insize, char* dataencrypted,
              int outsize);
  int Decrypt(const char* pszInText, int insize, char* datadecrypted,
              int outsize);
};
// 慢速实现
S_CORE_EXPORT int Encrypt(const char* pszInText, int insize,
                          char* dataencrypted, int outsize, const char* key);
S_CORE_EXPORT int Decrypt(const char* pszInText, int insize,
                          char* datadecrypted, int outsize, const char* key);
}  // namespace base
}  // namespace qb
